package com.spzx.order.receiver;

import com.rabbitmq.client.Channel;
import com.spzx.common.rabbit.constant.MqConst;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class TestReceiver {
        /**
     * 测试消息监听方法
     * 通过RabbitMQ监听指定队列的消息，用于验证消息队列功能是否正常工作
     *
     * @param content 消息体内容，即发送方传递的具体消息数据
     * @param message Spring AMQP的Message对象，包含消息的元数据信息（如消息头、属性等）
     * @param channel RabbitMQ通道对象，用于手动确认消息
     * @throws Exception 可能抛出的异常
     */
    @SneakyThrows  // Lombok注解，用于静默处理检查型异常，避免显式try-catch或throws声明
    @RabbitListener(bindings = @QueueBinding(
            // 绑定交换机配置
            exchange = @Exchange(value = MqConst.EXCHANGE_TEST, durable = "true"),  // 指定交换机名称和持久化属性
            // 绑定队列配置
            value = @Queue(value = MqConst.QUEUE_TEST, durable = "true"),  // 指定队列名称和持久化属性
            // 绑定路由键配置
            key = MqConst.ROUTING_TEST  // 指定路由键，用于消息路由
    ))
    public void test(String content, Message message, Channel channel) {
        // 记录接收到的消息内容，用于调试和监控
        log.info("接收到消息：{}", content);
        // 手动确认消息接收成功，确保消息不会重复消费
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
    }

}

